home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
VISUALBA
/
BOZOL2.ZIP
/
DATABASE.BAS
< prev
next >
Wrap
BASIC Source File
|
1994-02-08
|
23KB
|
747 lines
'=========================================================================
' dBASE III Plus file interface subroutines begin here
'=========================================================================
SUB dBSetIndexTo(IX$,Fld$,e%)
e%=0
' Make sure a database is open
IF dBASEOpen%=0 THEN e%=1:EXIT SUB
' close existing index if it is open
IF IX$="" OR Index$<>"" THEN Index$="":_
CALL BT("","Q","","","","",r%)
IF IX$="" THEN EXIT SUB
' verify filename exists
IF DIR$(IX$)="" THEN e%=3:EXIT SUB
' verify field exists in database
Fld%=0:Fld$=UCASE$(Fld$)
FOR y%=1 TO NumberOfFields?
IF INSTR(DBS(y%).FieldName,Fld$)=1 THEN Fld%=y%:EXIT FOR
NEXT y%
IF Fld%=0 THEN e%=2:EXIT SUB
Index$=IX$:IndexField$=Fld$:IndexField?=Fld%
END SUB
SUB dBCreateIndex(IX$, Fld$, e%)
REDIM K$(1000), D$(1000)
Bt.Update.Always%=0
' Make sure a database is open
IF dBASEOpen%=0 THEN e%=1:GOTO ExitSub
' close existing index if it is open
IF IX$="" OR Index$<>"" THEN Index$="":_
CALL BT("","Q","","","","",r%)
IF IX$="" THEN EXIT SUB
' verify field exists in database
Fld%=0:Fld$=UCASE$(Fld$)
FOR y%=1 TO NumberOfFields?
IF INSTR(DBS(y%).FieldName,Fld$)=1 THEN Fld%=y%:EXIT FOR
NEXT y%
IF Fld%=0 THEN e%=2:GOTO EXITSUB
Index$=IX$:IndexField$=Fld$:IndexField?=Fld%
' Create the index and build it.
K$=SPACE$(DBS(Fld%).FieldLength):D$=CHR$(0,0,0,0)
CALL BT(Index$,"C",K$,D$,RK$,RD$,R%)
IF NOT R% THEN E%=3:GOTO EXITSUB ' could not create index
x%=CSRLIN:y%=POS(0)
For y???=1 TO NumberOfRecords???
dBGetRecord Y???, e%
IF e% THEN e%=4:EXIT FOR
IF INSTAT OR COMCHARS% THEN A$=BOZOINKEY$:IF A$=CHR$(27) THEN e%=5:EXIT FOR
' ====================
' remove the UCASE$ here if you do not want the index to be
' create as case insensative.
K$=UCASE$(dBGetCField$(Indexfield$, e%))
' ^^^^^^____________________________ ^
IF e% THEN e%=6:EXIT FOR
D$=MKDWD$(Y???) ' must know the record number!
INCR i%
K$(i%)=K$:D$(i%)=D$
IF i%=1000 THEN
FOR ii%=1 TO 1000
CALL BT(Index$,"A",K$(ii%),D$(ii%),RK$,RD$,r%)
IF NOT r% THEN e%=7:EXIT FOR
NEXT ii%
i%=0
IF e%=7 THEN EXIT FOR
END IF
X%=BOZOCSRLIN:Y%=BOZOPOS:BOZOPRINT STR$(Y???):BOZOLOCATE X%,Y%
NEXT y???
FOR ii%=1 TO i%
CALL BT(Index$,"A",K$(ii%),D$(ii%),RK$,RD$,r%)
IF NOT r% THEN e%=7:EXIT FOR
NEXT ii%
CALL BT(Index$,"Q","","","","",r%)
ExitSub:
BT.Update.Always%=-1
END SUB
SUB dBSearchIndex(Findme$,e%)
e%=0
IF dBaseOpen%=0 THEN e%=1:EXIT SUB
IF Index$="" THEN
BOZOPRINT CrLf$+"Index not open, scan database? (Y/N): "
YN$=BOZOINPUT$
IF UCASE$(YN$)="Y" THEN
' scan the whole database for a match
FOR y???=1 TO NumberOfRecords???
dBGetRecord y???, e%
IF e% THEN EXIT FOR
IF INSTR(FindMe$,RecordBlock$) THEN EXIT FOR
NEXT y???
IF y???=>NumberOfRecords THEN _
BOZOPRINT "Not Found. Press a key..."
CWAIT
BOZOPRINT CrLf$
END IF
ELSE
Findme$=UCASE$(Findme$)
CALL BT(Index$,"S", Findme$, D$, RK$, RD$, r%)
'IF NOT r% THEN e%=2:EXIT SUB
FindMe$=RK$
R???=CVDWD(RD$)
IF R???>0 THEN CALL dBGetRecord(R???,e%)
END IF
END SUB
SUB dBSkip(NS%, e%)
e%=0
IF LEN(INDEX$) THEN
DO
IF NS%<0 THEN BT Index$,"P","","",K$,D$,r%:INCR NS% ELSE _
BT Index$,"N","","",K$,D$,r%:DECR NS%
IF NOT r% THEN e%=-1:EXIT SUB
IF INSTAT THEN IF A$=CHR$(27) THEN NS%=0
LOOP WHILE NS%<>0
dBGetRecord CVDWD(D$), e%
ELSE
RN???=RecNum??? + NS%
IF RN??? < 1 THEN RN???=1:e%=-1
IF RN??? > NumberOfRecords??? THEN RN???=NumberOfRecords???:e%=-1
dBGetRecord RN???,e%
END IF
END SUB
SUB dBGotoTop (e%)
e%=0
IF LEN(INDEX$) THEN
BT Index$,"F","","",K$,D$,r%
IF NOT r% THEN e%=-2:EXIT SUB
DBGetRecord CVDWD(D$),e%
ELSE
DBGetRecord 1, e%
END IF
END SUB
SUB dBGotoBottom (e%)
e%=0
IF LEN(INDEX$) THEN
BT Index$,"L","","",K$,D$,r%
IF NOT r% THEN e%=-2:EXIT SUB
DBGetRecord CVDWD(D$),e%
ELSE
DBGetRecord NumberOfRecords???, e%
END IF
END SUB
SUB dBEditRecord (RN???, e%)
e%=0
dBGetRecord RN???, e%
IF e% THEN EXIT SUB
' remove entry from index
IF LEN(INDEX$) THEN
BT Index$,"D",UCASE$(DBGetCField$(IndexField$,e%)),MKDWD$(RN???),"","",r%
IF NOT r% THEN BOZOPRINT "Error accessing index file"+CrLf$
END IF
' edit the record
DBEditFields e%
' replace entry in index
IF LEN(INDEX$) THEN
BT Index$,"A", UCASE$(DBGetCField$(IndexField$,e%)),MKDWD$(RN???),"","",r%
IF NOT r% THEN BOZOPRINT "Error updating index file"+CrLf$
END IF
END SUB
SUB dBAppendRecord (e%)
e%=0
IF dBaseOpen%=0 THEN e%=1:EXIT SUB
Recnum???=0
RecordBlock$=SPACE$(LEN(RecordBlock$))
DbEditFields e%
IF Recnum???>0 AND LEN(INDEX$) THEN
BT Index$, "A", UCASE$(DBGetCField$(IndexField$,e%)),MKDWD$(RecNum???),"","",r%
IF NOT r% THEN BOZOPRINT "Error appending index file."+CrLf$
END IF
END SUB
SUB dBDefaultFormat
' Create a default field edit format.
IF dBaseOpen%=0 THEN EXIT SUB
REDIM DBE(256) AS DBaseEditFormat
k%=1
FOR y%=1 to NumberOfFields?
INCR j%:IF j%=20 THEN j%=1:k%=k%+40:IF K%=81 THEN EXIT FOR
DBE(y%).FieldName = DBS(y%).FieldName
DBE(y%).FieldType = DBS(y%).FieldType
DBE(y%).FieldLength = DBS(y%).FieldLength
DBE(y%).FieldRow = j%
DBE(y%).FieldCol = k%+(11-LEN(RTRIM$(DBS(y%).FieldName,CHR$(0))))
DBE(y%).FieldFG = 0
DBE(y%).FieldBG = 7
NEXT y%
END SUB
SUB dBCreateFormat
IF dBaseOpen%=0 THEN BOZOPRINT "No Database is in USE."+CrLf$:EXIT SUB
DO
BOZOCLS
DBView
BOZOLOCATE 23,1:BOZOCOLOR 7,0:BOZOPRINT "Press ENTER to Accept or Fieldname to change: "
F$=BOZOINPUT$
IF F$="" THEN
B%=FREEFILE
BOZOLOCATE 23,1:BOZOPRINT SPACE$(80)
BOZOLOCATE 23,1:BOZOPRINT "Enter format filename: "
F$=BOZOINPUT$
IF F$="" THEN F$="NONAME.FMT"
OPEN F$ FOR RANDOM SHARED AS #B% LEN=LEN(DBE(1))
Fld%=1
DO UNTIL DBE(Fld%).FieldLength=0
PUT #B%, Fld%, DBE(Fld%)
INCR Fld%
LOOP
EXIT LOOP
ELSE
Fld%=0
F$=UCASE$(F$)
FOR y%=1 TO NumberOfFields?
IF INSTR(DBS(y%).FieldName,F$)=1 THEN Fld%=y%:EXIT FOR
NEXT y%
IF Fld%=0 THEN BOZOLOCATE 23,1:BOZOPRINT SPACE$(80):BOZOLOCATE 23,1:BOZOPRINT "BAD FIELD NAME":SOUND 50,4:DELAY 2:ITERATE LOOP
BOZOLOCATE 23,1:BOZOPRINT SPACE$(80):BOZOLOCATE 23,1:BOZOPRINT "Use arrow keys to place new field position"
X%=DBE(Fld%).FieldRow
Y%=DBE(Fld%).FieldCol
F$=RTRIM$(DBE(Fld%).FieldName,CHR$(0))+":"+STRING$(DBE(Fld%).FieldLength,176)
' edit field location
DBSCRNFIND X%, Y%, F$
IF X%=0 THEN EXIT LOOP
DBE(Fld%).FieldRow = X%
DBE(Fld%).FieldCol = Y%
END IF
LOOP
END SUB
SUB dBSetFormatTo(FormatFileName$,Ecode%)
Ecode%=0
IF FormatFileName$="" THEN ERASE DBE():EXIT SUB
IF Dir$(FormatFileName$)="" THEN Ecode%=1:EXIT SUB
B%=FREEFILE
OPEN FormatFileName$ FOR RANDOM SHARED AS #B% LEN=LEN(DBE(1))
FOR y%=1 TO LOF(B%)\LEN(DBE)
GET #B%, y%, DBE(y%)
NEXT y%
CLOSE #B%
END SUB
SUB dBView
Fld%=1
of%=(PBVScrnTxtAttr AND &HF) ' get the original foreground and background
ob%=(PBVScrnTxtAttr \ &H10) ' BOZOCOLORs, in case they change.
DO UNTIL DBE(Fld%).FieldLength=0
BOZOLOCATE DBE(Fld%).FieldRow,DBE(Fld%).FieldCol
BOZOCOLOR of%,ob%
BOZOPRINT RTRIM$(DBE(Fld%).FieldName,chr$(0))+":"
X%=BOZOCSRLIN:Y%=BOZOPOS
BOZOCOLOR DBE(Fld%).FieldFG,DBE(Fld%).FieldBG
BOZOPRINT SPACE$(DBE(Fld%).FieldLength)
BOZOLOCATE X%,Y%
IF DBE(Fld%).FieldType="N" THEN
BOZOPRINT LTRIM$(STR$(dBGetNField!((DBE(Fld%).FieldName),E%)))
IF E% THEN BOZOPRINT "???"
ELSE
BOZOPRINT dBGetCField$((DBE(Fld%).FieldName),E%)